Tidy up vm_assist handling.
Signed-off-by: Keir Fraser <keir@xensource.com>
.section __xen_guest
.ascii "GUEST_OS=linux,GUEST_VER=2.4,XEN_VER=3.0,VIRT_BASE=0xC0000000"
.ascii ",LOADER=generic"
- .ascii ",PT_MODE_WRITABLE"
.byte 0
.text
blk_nohighio = 1;
#endif
- HYPERVISOR_vm_assist(VMASST_CMD_enable,
- VMASST_TYPE_4gb_segments);
+ HYPERVISOR_vm_assist(
+ VMASST_CMD_enable, VMASST_TYPE_4gb_segments);
+ HYPERVISOR_vm_assist(
+ VMASST_CMD_enable, VMASST_TYPE_writable_pagetables);
HYPERVISOR_set_callbacks(
__KERNEL_CS, (unsigned long)hypervisor_callback,
.section __xen_guest
.ascii "GUEST_OS=linux,GUEST_VER=2.6,XEN_VER=3.0,VIRT_BASE=0xC0000000"
.ascii ",LOADER=generic"
- .ascii ",PT_MODE_WRITABLE"
.byte 0
.text
/* Register a call for panic conditions. */
notifier_chain_register(&panic_notifier_list, &xen_panic_block);
- HYPERVISOR_vm_assist(VMASST_CMD_enable,
- VMASST_TYPE_4gb_segments);
+ HYPERVISOR_vm_assist(
+ VMASST_CMD_enable, VMASST_TYPE_4gb_segments);
+ HYPERVISOR_vm_assist(
+ VMASST_CMD_enable, VMASST_TYPE_writable_pagetables);
memcpy(&boot_cpu_data, &new_cpu_data, sizeof(new_cpu_data));
early_cpu_init();
if ( !test_and_set_bit(0, &printed) )
{
- HYPERVISOR_vm_assist(VMASST_CMD_disable,
- VMASST_TYPE_4gb_segments_notify);
+ HYPERVISOR_vm_assist(
+ VMASST_CMD_disable, VMASST_TYPE_4gb_segments_notify);
DP("");
DP("***************************************************************");
static int __init fixup_init(void)
{
- HYPERVISOR_vm_assist(VMASST_CMD_enable,
- VMASST_TYPE_4gb_segments_notify);
+ HYPERVISOR_vm_assist(
+ VMASST_CMD_enable, VMASST_TYPE_4gb_segments_notify);
return 0;
}
__initcall(fixup_init);
HYPERVISOR_shared_info = (shared_info_t *)empty_zero_page;
clear_fixmap(FIX_SHARED_INFO);
- memcpy(&suspend_record->resume_info, &xen_start_info, sizeof(xen_start_info));
+ memcpy(&suspend_record->resume_info, &xen_start_info,
+ sizeof(xen_start_info));
HYPERVISOR_suspend(virt_to_machine(suspend_record) >> PAGE_SHIFT);
- HYPERVISOR_vm_assist(VMASST_CMD_enable,
- VMASST_TYPE_4gb_segments);
- HYPERVISOR_vm_assist(VMASST_CMD_enable,
- VMASST_TYPE_writable_pagetables);
-
shutting_down = -1;
- memcpy(&xen_start_info, &suspend_record->resume_info, sizeof(xen_start_info));
+ memcpy(&xen_start_info, &suspend_record->resume_info,
+ sizeof(xen_start_info));
#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,0)
set_fixmap_ma(FIX_SHARED_INFO, xen_start_info.shared_info);
unsigned long v_kernend;
unsigned long v_kernentry;
- unsigned int use_writable_pagetables;
unsigned int load_bsd_symtab;
unsigned long symtab_addr;
if ( rc != 0 )
goto error_out;
- if (dsi.use_writable_pagetables)
- xc_domain_setvmassist(xc_handle, dom, VMASST_CMD_enable,
- VMASST_TYPE_writable_pagetables);
-
if (dsi.load_bsd_symtab)
loadelfsymtab(image, xc_handle, dom, NULL, &dsi);
if ( (p = strstr(guestinfo, "VIRT_BASE=")) != NULL )
dsi->v_start = strtoul(p+10, &p, 0);
- if ( (p = strstr(guestinfo, "PT_MODE_WRITABLE")) != NULL )
- dsi->use_writable_pagetables = 1;
-
if ( (p = strstr(guestinfo, "BSD_SYMTAB")) != NULL )
dsi->load_bsd_symtab = 1;
unsigned long v_kernend;
unsigned long v_kernentry;
- unsigned int use_writable_pagetables;
unsigned int load_bsd_symtab;
unsigned long symtab_addr;
if ( rc != 0 )
goto error_out;
- if (dsi.use_writable_pagetables)
- xc_domain_setvmassist(xc_handle, dom, VMASST_CMD_enable,
- VMASST_TYPE_writable_pagetables);
-
if (dsi.load_bsd_symtab)
loadelfsymtab(image, xc_handle, dom, NULL, &dsi);
}
dsi->v_start = 0x00000000;
- dsi->use_writable_pagetables = 0;
dsi->load_bsd_symtab = 0;
dsi->v_kernstart = kernstart - LINUX_PAGE_OFFSET;
memcpy(c->debugreg,
ed->arch.debugreg,
sizeof(ed->arch.debugreg));
+#if defined(__i386__)
c->event_callback_cs = ed->arch.event_selector;
c->event_callback_eip = ed->arch.event_address;
c->failsafe_callback_cs = ed->arch.failsafe_selector;
c->failsafe_callback_eip = ed->arch.failsafe_address;
+#elif defined(__x86_64__)
+ c->event_callback_eip = ed->arch.event_address;
+ c->failsafe_callback_eip = ed->arch.failsafe_address;
+ c->syscall_callback_eip = ed->arch.syscall_address;
+#endif
+ c->vm_assist = ed->domain->vm_assist;
}
for ( i = 0; i < 8; i++ )
(void)set_debugreg(ed, i, c->debugreg[i]);
+#if defined(__i386__)
ed->arch.event_selector = c->event_callback_cs;
ed->arch.event_address = c->event_callback_eip;
ed->arch.failsafe_selector = c->failsafe_callback_cs;
ed->arch.failsafe_address = c->failsafe_callback_eip;
+#elif defined(__x86_64__)
+ ed->arch.event_address = c->event_callback_eip;
+ ed->arch.failsafe_address = c->failsafe_callback_eip;
+ ed->arch.syscall_address = c->syscall_callback_eip;
+#endif
+
+ if ( ed->eid == 0 )
+ d->vm_assist = c->vm_assist;
phys_basetab = c->pt_base;
ed->arch.guest_table = ed->arch.phys_table = mk_pagetable(phys_basetab);
if ( rc != 0 )
return rc;
- /* Set up domain options */
- if ( dsi.use_writable_pagetables )
- vm_assist(d, VMASST_CMD_enable, VMASST_TYPE_writable_pagetables);
-
/* Align load address to 4MB boundary. */
dsi.v_start &= ~((1UL<<22)-1);
{
case VMASST_CMD_enable:
set_bit(type, &p->vm_assist);
- if (vm_assist_info[type].enable)
- (*vm_assist_info[type].enable)(p);
return 0;
case VMASST_CMD_disable:
clear_bit(type, &p->vm_assist);
- if (vm_assist_info[type].disable)
- (*vm_assist_info[type].disable)(p);
return 0;
}
{
if ( (p = strstr(guestinfo, "VIRT_BASE=")) != NULL )
dsi->v_start = simple_strtoul(p+10, &p, 0);
-
- if ( (p = strstr(guestinfo, "PT_MODE_WRITABLE")) != NULL )
- dsi->use_writable_pagetables = 1;
}
dsi->v_kernstart = kernstart;
return (XEN_VERSION<<16) | (XEN_SUBVERSION);
}
-vm_assist_info_t vm_assist_info[MAX_VMASST_TYPE + 1];
long do_vm_assist(unsigned int cmd, unsigned int type)
{
return vm_assist(current->domain, cmd, type);
// from linux/include/linux/mm.h
extern struct page *mem_map;
-// defined in include/asm-x86/mm.h, not really used for ia64
-typedef struct {
- void (*enable)(struct domain *p);
- void (*disable)(struct domain *p);
-} vm_assist_info_t;
-extern vm_assist_info_t vm_assist_info[];
-
// xen/include/asm/config.h
extern char _end[]; /* standard ELF symbol */
#define memguard_unguard_range(_p,_l) ((void)0)
#endif
-
-typedef struct {
- void (*enable)(struct domain *);
- void (*disable)(struct domain *);
-} vm_assist_info_t;
-extern vm_assist_info_t vm_assist_info[];
-
-
/* Writable Pagetables */
typedef struct {
/* Linear address where the guest is updating the p.t. page. */
unsigned long event_callback_eip;
unsigned long failsafe_callback_cs; /* CS:EIP of failsafe callback */
unsigned long failsafe_callback_eip;
+ unsigned long vm_assist; /* VMASST_TYPE_* bitmap */
} PACKED full_execution_context_t;
typedef struct {
unsigned long kernel_ss, kernel_esp; /* Virtual TSS (only SS1/ESP1) */
unsigned long pt_base; /* CR3 (pagetable base) */
unsigned long debugreg[8]; /* DB0-DB7 (debug registers) */
- unsigned long event_callback_cs; /* CS:EIP of event callback */
unsigned long event_callback_eip;
- unsigned long failsafe_callback_cs; /* CS:EIP of failsafe callback */
unsigned long failsafe_callback_eip;
+ unsigned long syscall_callback_eip;
+ unsigned long vm_assist; /* VMASST_TYPE_* bitmap */
} PACKED full_execution_context_t;
typedef struct {
unsigned long v_kernstart;
unsigned long v_kernend;
unsigned long v_kernentry;
-
- unsigned int use_writable_pagetables;
};
#include <asm/uaccess.h> /* for KERNEL_DS */